package server.sisPensionesRecaudoNoCifrado;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.SecureRandom;
import java.util.Random;


/**
 * 
 * @author Mauricio Pradilla Hosie m.pradilla323@uniandes.edu.co
 * @author Martin Uribe Gutierrez m.uribe... 
 * Infraestructura Computacional
 * Universidad de los Andes
 * Algoritmos tomados de: http://www.java2s.com/Code/Java/Security/CatalogSecurity.htm
 * http://www.bouncycastle.org
 * Clase que modela el servidor de pensiones de recaudo de nuevos pagos de los empleados. Ejecuta transacciones sin implementar m�todos 
 * que permitan la seguridad en canales.
 */
public class SisPensionesRecaudoNoCifrado extends Thread {
	
	
	/**
	 * Puerto Seguro por el cual se va a comunicarse con el servidor
	 */
	public final static int PUERTO = 1025;
	
	public final static int MIN = 30001;
	public final static int MAX = 30002;
	
	/**
	 * Modela el canal de recepci�n del servidor
	 */
	private ServerSocket serverSocket;
	
	private int port;
	
	/**
	 * Constructor de la clase, utiliza un modelo thread por conexi�n y responsabiliza a una clase Protocolo para atender un nuevo cliente
	 */
	private SisPensionesRecaudoNoCifrado(int newPort){
		port = newPort;

	}
	
	/**
	 * Implementaci�n del m�todo run() la interfaz Thread. 
	 */
	public void run()
	{
		try {
			
			
				serverSocket = new ServerSocket(port);//PUERTO);
				System.out.println("SisPensionesRecaudoNoCifrado Iniciado: "+port);
				while( true )
				{
					//Crea un nuevo thread por cada conexion.
					Socket nuevaConecion = serverSocket.accept();
					ProtocoloNoCifrado p = new ProtocoloNoCifrado(nuevaConecion);
					p.start();
					System.out.println("Conexi�n recibida> "+port);
				}					
			
		
		} 
		catch (IOException e)
		{	
			e.printStackTrace();
		}
		catch (Exception e) 
		{
			e.printStackTrace();
		}

	}	
	
	/**
	 * Generador de las llaves asim�tricas
	 * @return las llaves asim�tricas
	 * @throws Exception
	 */
	public static KeyPair generateRSAKeyPair() throws Exception 
	{
		KeyPairGenerator kpGen = KeyPairGenerator.getInstance("RSA", "BC");
		kpGen.initialize(1024, new SecureRandom());
		return kpGen.generateKeyPair();
	}
	
	/**
	 * Metodo de inicio del servidor.
	 * @param args
	 */
	public static void main(String[] args) 
	{
		for (int i = MIN; i < MAX; i++) {
		SisPensionesRecaudoNoCifrado app = new SisPensionesRecaudoNoCifrado(i);
		app.start();
		}
	}
	
	public static void initialize() 
	{
		for (int i = MIN; i < MAX; i++) {
		SisPensionesRecaudoNoCifrado app = new SisPensionesRecaudoNoCifrado(i);
		app.start();
		}
	}	

}
